home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / help10.arc / VHELP.8 < prev    next >
Text File  |  1987-03-06  |  11KB  |  250 lines

  1. ; HELP.COM by Bob Montgomery, 2/23/87
  2. ; This program is a generic help screen template for use with the A86
  3. ; assembler. The desired help message is written as db's at Hlpst in
  4. ; place of the test message that is there now. The only restrictions 
  5. ; on the help message are:
  6. ;    1. The message must not exceed 80 characters wide.
  7. ;    2. The message must not exceed 25 lines long.
  8. ;    3. Each help line must be the same length.
  9. ; The program will auto center the message on the display screen. The hot 
  10. ; key combo to bring up the help screen is defined as Hotkey below (set 
  11. ; for Cntl-Leftshift right now) and can be changed to another combination
  12. ; by changing the equate for Hotkey.
  13.  
  14.      jmp  Init           ;Initialize program
  15.  
  16. Esc  equ  1Bh
  17. Vidmem equ 0B800         ;Location of screen 0
  18. Monomem equ 0B000        ;Location of mono screen
  19. BWattr equ 70h           ;Grey background, black foreground
  20.  
  21. ; Bits in shift status
  22. Rtsh   equ 1
  23. Lftsh  equ 2
  24. Cntl   equ 4
  25. Alt    equ 8
  26. Scrl   equ 10h
  27. Numl   equ 20h
  28. Capl   equ 40h
  29.  
  30. Mode   db  ?             ;Current video mode
  31. Vpage  db  ?             ;Current video page
  32. Vidseg dw  ?             ;Current page segment
  33. Hlpflg db  0             ;1 => Help on
  34. Attr   db  ?             ;Attribute to use
  35. Cursor dw  ?             ;Current cursor type
  36.  
  37. ; =================================================================
  38. ; This is the VEdit Plus help message to be displayed in blue on white
  39. ; when Cntl-Left Shift pressed. 74 char X 25 lines screen size.
  40.  
  41. Colattr equ 71h          ;White background, blue foreground
  42. Hotkey equ Cntl+Lftsh    ;Cntl-Left Shift key combo brings up screen
  43.  
  44. Hlpst: db 201,72 dup(205),187  ;Border chars
  45. Linchr equ $-Hlpst       ;Chars on each help line
  46.      db   186,'                   VEdit Plus Help by Bob Montgomery        Esc to Exit ',186
  47.      db   186,'All E & R Commands after Esc  Reg n=0-9 & A-Z  ^=Cntl  a=Alt  *=filespec',186
  48.      db   186,' Cursor Movement     Block/Find      File/Set Cmds     Miscellaneous    ',186
  49.      db   199,72 dup(196),182
  50.      db   186,'^Home Top of File',179,'F9  Block Start  ',179,'EA   Save File   ',179,'F1   Scroll Left  ',186
  51.      DB   186,'^End  End of File',179,'F9n Copy to Reg n',179,'EB * Open File   ',179,'F2   Scroll Right ',186
  52.      db   186,' F3   St of Line ',179,'aF9n Cut to Reg n',179,'EF   Close File  ',179,'Home Scroll Up    ',186
  53.      db   186,' F6   End of Line',179,'F10n Insert Reg n',179,'EG * Get File    ',179,'End  Scroll Down  ',186
  54.      db   186,' F5  St Next Line',179,'aF1  Find Text   ',179,'EW * Write File  ',179,'F7 Decrease Indent',186
  55.      db   186,' ^J  St/End Line ',179,'aF2  Replace Text',179,'EX   Save & Exit ',179,'F8 Increase Indent',186
  56.      db   186,' ^K  Top/Bot Scrn',179,'aF3  Cancel Oper ',179,'EQ(Y) Quit & Exit',179,'^P Mrk Prnt St/End',186
  57.      DB   186,' ^V  Word Left   ',179,'^Rn  Repeat=n    ',179,'EZ(Y) Quit & Stay',179,'^C Del Prev Word  ',186
  58.      DB   186,' ^B  Word Right  ',179,'RSn * Save Reg n ',179,'ED   Display Dir ',179,'^N Del Next Word  ',186
  59.      DB   186,'^PgUp Prev Paragr',179,'RLn * Load Reg n ',179,'EP3 n IndntIncr=n',179,'^Z Del to End Line',186
  60.      DB   186,'^PgDn Next Paragr',179,'^Sn Set Bkmark n ',179,'EP7 n Wdwrp Col=n',179,'^X Del This Line  ',186
  61.      DB   186,' Tab  Tab Text Rt',179,'^Gn Goto Bkmark n',179,'ET n  Tab Incr=n ',179,'^U Undo Line Chngs',186
  62.      DB   186,' F4 Tab Cursor Rt',179,'^F Format Paragrf',179,'ES1 1 Expand Tabs',179,'^L Nxt Chr Literal',186
  63.      DB   186,' Commands (after Esc), where $=Esc; n=# => Forever (to end of file)     ',186
  64.      DB   186,' n[Cmds]=Repeat Cmds n times from cursor       ^Q=Next Char Literal     ',186
  65.      DB   186,' B Goto Text Strt',179,'Gr Insert Reg r  ',179,' nFstring$ Find nth string occurance',186
  66.      DB   186,' Z Goto Text End ',179,'nK Kill n Lines  ',179,' Itext$    Insert text at cursor    ',186
  67.      DB   186,' nC Advnc n Chars',179,'nL Advnce n Lines',179,' nSs1$s2$  Change s1 to s2 n times  ',186
  68.      db   186,' nD Del n Chars  ',179,'nT Type n Lines  ',179,' V Return to Visual Mode            ',186
  69.      db   200,72 dup(205),188
  70. ; ====================================================================
  71.  
  72. Msglen equ $-Hlpst       ;# chars in help buffer
  73. Lines equ Msglen/Linchr  ;# lines of help
  74. Buflen equ 2*Msglen      ;Screen data buffer length
  75. Stlin equ (25-Lines)/2   ;Start line
  76. Stchr equ (80-Linchr)/2  ;Start byte on line
  77. Stscr equ 160*Stlin + 2*Stchr ;Start of mem to put help
  78.  
  79. Scrbuf: db Buflen dup (?) ;Buffer for screen data
  80.  
  81. ; New Int 9 routine - check for Cntrl-LShift; ignore others.
  82. ; Since Int 9 is called every time a key is pressed or released, and
  83. ; reads the keyboard thru some mysterious means in BIOS, we must call
  84. ; the old Int 9 as a subroutine each time an Int 9 is generated. But,
  85. ; an interrupt routine has a IRET instead of a RET as the return
  86. ; instruction, which pops the return address like a RET does, and then
  87. ; pops the flags. So to call Int 9 like a subroutine, we have to push
  88. ; the flags first; then when the the IRET is executed, control returns
  89. ; to our program with the stack pointer at the right place.
  90.  
  91. Start: push ax,bx,cx,dx,ds,es,di,si ;Save all for calling program
  92.      pushf               ;Put flags on stack since Int pops flags
  93. Oldint: call 0000:0000   ;Call old Int 9 to get key-will pop flags
  94.      mov  ah,2           ;Get shift status
  95.      Int  16h            ;in al
  96.      and  al,Hotkey      ;Only keep Hot keys
  97.      cmp  al,Hotkey      ;Were both pressed?
  98.      jne  Exit           ;No
  99.      mov  ds,cs          ;Yes, set ds=cs
  100.      cmp  Hlpflg,1       ;Is help already up?
  101.      jne  Go             ;No, put it up
  102. ; If help is already up, ignore the Hotkey.
  103. Exit: pop si,di,es,ds,dx,cx,bx,ax ;Restore all for calling program
  104.      iret                ;Pop return address and flags
  105.  
  106. ; Come here if should put up help.
  107. Go:  mov  al,Colattr     ;Assume color
  108.      mov  Attr,al
  109.      mov  ah,15          ;Get video mode in al
  110.      int  10h            ;and page in bh
  111.      mov  Mode,al        ;Save Mode
  112.      mov  Vpage,bh       ;and page
  113.      cmp  al,2           ;Mode=2?
  114.      je   Color          ;Yes
  115.      cmp  al,3           ;Mode=3?
  116.      je   Color          ;Yes
  117.      cmp  al,7           ;Mode=7? (mono)
  118.      jne  Exit           ;No, must be graphics so exit
  119.      mov  al,BWattr      ;Set B&W attribute
  120.      mov  Attr,al
  121.      mov  bx,Monomem     ;and start of mono video memory
  122.      jmp  short A0
  123. Color: mov  bl,0         ;Bx=256*display page
  124.      add  bx,Vidmem      ;Get display mem segment
  125. A0:  mov  ds,bx          ;in ds
  126.  
  127. ; Put up help screen.
  128. ; First save current screen to buffer.
  129.      call Hidecur        ;Hide cursor
  130.      call Vidoff         ;Disable video (avoids snow on CGA)
  131.      mov  dl,Lines       ;Get # lines of help
  132.      mov  es,cs          ;es=cs
  133.      mov  si,Stscr       ;ds:si points to help screen area in disp mem
  134.      mov  di,Scrbuf      ;es:di points to buffer for screen data
  135.      push si,es,ds       ;Save them
  136.      mov  ch,0           ;ch=0
  137.      mov  cl,Linchr      ;cx=chars/help line
  138. A1:  push si,cx          ;Save position in scrn mem & chars/line
  139.      cld                 ;Set to inc si & di
  140.      rep  movsw          ;Move screen to buffer
  141.      pop  cx,si          ;Get start of line & chars/line
  142.      add  si,160         ;Next line, same column
  143.      dec  dl             ;Done all lines?
  144.      jne  A1             ;No
  145.  
  146. ; Now put up help.
  147.      pop  es,ds,di       ;Now ds=cs, es:di=help scrn area in screen mem
  148.      push di,ds,es       ;Put back in orig order
  149.      mov  si,Hlpst       ;Point si to help data
  150.      mov  dl,Lines       ;Get chars/help line
  151.      mov  ah,Attr        ;Get char attribute (color)
  152. B1:  push di,cx          ;Save disp mem pos & chars/help line
  153. B2:  lodsb               ;Get a help char in al
  154.      stosw               ;Save char & attribute in screen mem
  155.      loop B2             ;Do whole line
  156.      pop  cx,di          ;Get start of disp line & chars/line
  157.      add  di,160         ;Next line, same column
  158.      dec  dl             ;Done all lines?
  159.      jne  B1             ;No
  160.      mov  Hlpflg,1       ;Yes, indicate help up
  161.      call Vidon          ;and enable video
  162.  
  163. ; Now, wait for the escape key; come here after each keypress (Int 9).
  164. Wait1: mov ah,0          ;Wait for a key
  165.      int  16h
  166.      cmp  al,Esc         ;Was it Escape?
  167.      jne  Wait1          ;No
  168.  
  169. ; If Esc was pressed, put the old screen back
  170.      pop  es,ds,di       ;ds=cs; es:di=start of help area in disp mem
  171.      mov  si,Scrbuf      ;Point to old screen data buffer
  172.      call Vidoff         ;Disable video (avoid snow on CGA)
  173.      mov  dl,Lines       ;Chars/help line
  174. C1:  push di,cx          ;Save scrn mem pointer & chars/line
  175.      rep  movsw          ;Move a line to scrn mem
  176.      pop  cx,di          ;Get start of line & chars/line
  177.      add  di,160         ;Next line, same column
  178.      dec  dl             ;Done all lines?
  179.      jne  C1             ;No
  180.      mov  Hlpflg,0       ;Yes, clear flag
  181.      call Vidon          ;Enable video
  182.      call Showcur        ;Turn cursor back on
  183.      jmp  Exit           ;and return
  184.  
  185. ; Sub to turn cursor off; come with ds=video.
  186. Hidecur: push cx,ds
  187.      mov  ds,cs          ;ds=cs
  188.      mov  ah,3           ;Get current cursor data
  189.      mov  bh,Vpage       ;for current page
  190.      int  10h
  191.      mov  Cursor,cx      ;Save cursor type
  192.      mov  ch,20h         ;Set cursor off
  193.      mov  ah,1
  194.      int  10h
  195.      pop  ds,cx
  196.      ret
  197.  
  198. ; Sub to turn cursor on; come with ds=cs.
  199. Showcur: mov  cx,Cursor  ;Set original cursor Type
  200.      mov  bh,Vpage
  201.      mov  ah,1
  202.      int  10h
  203.      ret
  204.  
  205. ; Turn video off
  206. Vidoff: cs cmp  Mode,7   ;Mono?
  207.      je   D0             ;Yes, skip wait for vert retrace
  208.      push ds,dx,ax
  209.      call Getmode        ;Get current video mode byte
  210.      and  al,0F7         ;Clear video enable bit
  211.      out  dx,al          ;Send to mode control port
  212.      pop  ax,dx,ds
  213. D0:  ret
  214.  
  215. ; Turn video on
  216. Vidon: cs cmp  Mode,7    ;Mono?
  217.      je   E0             ;Yes, skip wait for vert retrace
  218.      push ds,dx,ax
  219.      call Getmode        ;Get current video mode byte
  220.      or   al,8           ;Set video enable bit
  221.      out  dx,al          ;Send to mode control port
  222.      pop  ax,dx,ds
  223. E0:  ret
  224.  
  225. ; Sub to wait for vertical retrace to avoid snow on CGA screen.
  226. Vert: mov dx,3DAh        ;CRT status port
  227. F1:  in   al,dx          ;Read status
  228.      test al,8           ;Vert retrace?
  229.      je   F1             ;No
  230.      mov  dx,3D8h        ;Point to video mode port
  231.      ret                 ;Yes, return
  232.  
  233. Getmode: call Vert       ;Wait for vert retrace
  234.      mov  ax,40h         ;Get video mode
  235.      mov  ds,ax          ;at 465h
  236.      mov  al,b[65h]
  237.      ret                 ;and return
  238.  
  239. ; Come here to install the program as the new Int 9 routine.
  240. Init: mov ax,3509h       ;Get current Int 9 vector
  241.      int  21h            ;in es:bx
  242.      mov  ds,cs          ;this code
  243.      mov  w[Oldint+1],bx ;Save it
  244.      mov  w[Oldint+3],es
  245.      mov  ax,2509h       ;Set new Int 9 routine
  246.      mov  dx,Start
  247.      int  21h
  248.      mov  dx,Init        ;Terminate and
  249.      int  27h            ;stay resident
  250.